2017-04-22 57 views
0

我想這個端口的程序,從工作到pythonC#端口BeautifulSoup到HtmlAgility

from __future__ import print_function 

import requests 
from bs4 import BeautifulSoup 

r = requests.get('http://www.forexfactory.com/calendar.php?day=nov18.2016') 
soup = BeautifulSoup(r.text, 'lxml') 

tables = soup.findAll("table", {'class':'calendar__table'}) 

for table in tables: 
    for row in table.findAll("tr"): 
     for cell in row.findAll("td"): 
      print (cell.text, end = " ") 
     print() 

這是我的[代碼片段]使用HtmlAgilityPackC#嘗試,但它不工作:

HtmlWeb browser = new HtmlWeb(); 
string URI = "http://www.forexfactory.com/calendar.php?day=nov18.2016"; 

ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true; 
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; 

HtmlDocument document = browser.Load(URI); 

foreach (HtmlNode row in document.DocumentNode.Descendants("table").FirstOrDefault(_ => _.Id.Equals("calendar__table")).Descendants("tr")) 
    Console.WriteLine(row); 
+1

Python代碼查找具有給定* class *屬性的'table'元素,您的C#代碼似乎尋找給定的* id *('_.Id.Equals')。我不熟悉C#的HTML解析,但我會去尋找一個類的等價物。 –

+0

如果有問題的HTML將多個類分配給同一個表,那麼HTML Agility Pack將不會嘗試解決這個問題。所以它可能需要一些工作來分割空白的類屬性並執行一個包含。 – jessehouwing

回答

1

您可以通過ID和單個節點使用此代碼

document.DocumentNode.SelectSingleNode("//table[@id='calendar_table']").Descendants("tr"); 
查詢

但我想,你需要通過類來查詢,而不是通過ID,所以代碼看起來像這樣

document.DocumentNode.SelectSingleNode("//table[@class='calendar_table']").Descendants("tr"); 

阿洛斯在Python代碼的類名是有兩個__符號,但在C#代碼與一個 - _

+0

謝謝,你在這兩方面都是正確的 - 需要__。這工作。 – Ivan