Vì vậy, tôi tương đối mới với python, và để tìm hiểu, tôi đã bắt đầu viết một chương trình trực tuyến để wikipedia, tìm liên kết đầu tiên trong phần tổng quan của một ngẫu nhiên bài viết, theo liên kết đó và tiếp tục cho đến khi nó đi vào vòng lặp hoặc tìm trang triết lý (như chi tiết here) và sau đó lặp lại quy trình này cho một bài viết ngẫu nhiên mới một số lần được chỉ định. Sau đó tôi muốn thu thập các kết quả dưới dạng cấu trúc dữ liệu hữu ích, để tôi có thể truyền dữ liệu đến R bằng cách sử dụng Rpy library để tôi có thể vẽ một số sơ đồ mạng (R là khá tốt khi vẽ những thứ tương tự) với mỗi trong sơ đồ biểu thị các trang được truy cập và các mũi tên mà các đường dẫn được lấy từ bài viết bắt đầu đến trang triết lý.Sơ đồ trò chơi triết học Wikipedia trong python và R
Vì vậy, tôi không gặp vấn đề gì khi bắt python trả lại html có cấu trúc khá từ wiki nhưng có một số vấn đề mà tôi không thể hiểu được. Cho đến bây giờ tôi đã chọn liên kết đầu tiên bằng cách sử dụng cssselector từ thư viện lxml. Nó chọn cho liên kết đầu tiên (trong một thẻ) mà là một hậu duệ trực tiếp của thẻ ap, đó là một hậu duệ trực tiếp của một thẻ div với class = "mw-content-lít" như thế này:
user_agent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT)'
values = {'name' : 'David Kavanagh',
'location' : 'Belfast',
'language' : 'Python' }
headers = { 'User-Agent' : user_agent }
encodes = urllib.urlencode(values)
req = urllib2.Request(url, encodes, headers)
page = urllib2.urlopen(req)
root = parse(page).getroot()
return root.cssselect("div.mw-content-ltr>p>a")[0].get('href')
Mã này nằm trong một hàm mà tôi sử dụng để tìm liên kết đầu tiên trong trang. Nó hoạt động cho hầu hết các phần nhưng vấn đề là nếu liên kết đầu tiên là bên trong một số thẻ khác như trái ngược với một hậu duệ trực tiếp của một thẻ p như chúng ta hãy nói một thẻ b hoặc một cái gì đó sau đó tôi bỏ lỡ nó. Như bạn có thể thấy từ bài viết trên wiki, liên kết in nghiêng hoặc bên trong dấu ngoặc đơn không đủ điều kiện cho trò chơi, có nghĩa là tôi không bao giờ nhận được liên kết in nghiêng (tốt) nhưng thường xuyên nhận được liên kết bên trong dấu ngoặc đơn (xấu) và đôi khi bỏ lỡ liên kết đầu tiên trên một trang như liên kết đầu tiên trên bài viết Chủ tịch, đó là phân, nhưng nó được in đậm, vì vậy tôi không hiểu. Tôi đã cố gắng loại bỏ các quy định hậu duệ trực tiếp nhưng sau đó tôi thường xuyên nhận được các liên kết "ở trên" phần tổng quan, thường nằm trong hộp bên, trong thẻ p, trong một bảng, trong cùng div như phần tổng quan.
Vì vậy, phần đầu của câu hỏi của tôi là:
Làm thế nào tôi có thể sử dụng cssselectors hoặc một số chức năng hoặc thư viện khác để chọn liên kết đầu tiên trong phần tổng quan đó không phải là dấu ngoặc đơn bên hoặc in nghiêng. Tôi nghĩ về việc sử dụng các biểu thức thông thường để xem qua html thô nhưng điều đó có vẻ giống như một giải pháp rất vụng về và tôi nghĩ rằng có thể có thứ gì đó đẹp hơn một chút mà tôi chưa từng nghĩ đến.
Vì vậy, hiện tại tôi đang lưu trữ kết quả trong danh sách danh sách. Vì vậy, tôi có một danh sách được gọi là đường dẫn, trong đó có danh sách có chứa các chuỗi có chứa tiêu đề của bài viết wiki.
Phần thứ hai của câu hỏi là: Làm cách nào tôi có thể duyệt qua danh sách danh sách này để thể hiện nhiều đường dẫn hội tụ? Lưu trữ các kết quả như thế này có phải là một ý tưởng hay không? Vì sơ đồ kết thúc trông giống như một cây lộn ngược, tôi nghĩ đến việc tạo ra một loại cây nào đó, nhưng điều đó có vẻ như rất nhiều công việc cho một cái gì đó mang tính khái niệm, khá đơn giản.
Bất kỳ ý tưởng hoặc đề xuất nào sẽ được đánh giá cao.
Chúc mừng,
Davy
Vui lòng không đăng hai câu hỏi khác nhau trong một! – taleinat
Súp đẹp có thể phân tích cú pháp HTML tốt hơn (IMO). Một đối tượng BS có các thuộc tính (trong ý nghĩa hướng đối tượng) sẽ trả về các thẻ lồng nhau cũng như các thuộc tính (trong ý nghĩa thẻ HTML) của thẻ. Nên là một cinch. Không ** sử dụng cụm từ thông dụng để phân tích cú pháp HTML http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – aitchnyu